/*
 * Hauptapplikation und Eintrittspunkt zur Anwendung
 *
 * 
 */
 
package com.rss.app;


import com.mysql.mysqlCategories;
import com.mysql.mysqlEntries;
import com.mysql.mysqlFeeds;
import com.objects.category;
import com.objects.entry;
import com.objects.feed;
import com.objects.user;
import com.vaadin.Application;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;




//Layout Imports


import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Table;
import com.vaadin.ui.Tree;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Window.Notification;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;





/** 
 *
 * @author admin
 * @version 
 */

public class rss_reader extends Application {

    //öffentliches Hauptfenster, um den Zugriff übergeben zu können
    public Window mainWindow = new Window("rss_reader");
    //Erstellen einer neuen Instanz eines Baums (später mit Kategorien und Feeds)
    private Tree tree = new Tree();
    //Erstellen einer neuen Instanz einer Tabelle (listet später Artikel des Feeds)
    private Table tbl = new Table();
    //User der Anwendung
    private user u;
    //ArrayList der aktuell ausgewählten entries des jeweiligen feeds
    private ArrayList<entry> currentEntries;
    //ArrayList der vorhandenen Kategorien
    private ArrayList<category> categories;
    //Variable des Fensters, zum Anzeigen des Feeds
    private show_window openEntryWindow;

    //init() wird immer wird aufgerufen, wenn die Applikation gestarten wird
    @Override
    public void init()  {
            //neues horizontales Layout anlegen
            HorizontalLayout layout = new HorizontalLayout();
            //layout dem Hauptfenster als Inhalt zuordnen
            mainWindow.setContent(layout);
            //layout zu maximaler Größe setzen
            layout.setSizeFull();

            //neues Panel für den Baum anlegen - dadurch sind Scrollbars möglich
            Panel treePanel = new Panel(); 
            //Panel in der Höhe maximieren
            treePanel.setHeight("100%");
            //Breite des Panels nicht definieren
            treePanel.setWidth(null);
             //Inhaltsgröße des Panels unbekannt setzen
            treePanel.getContent().setSizeUndefined();
            //Panel dem Layout hinzufügen
            layout.addComponent(treePanel);
           
            //neuen Button zum Hinzufügen eines Feeds erstellen
             Button newFeedBtn = new Button("Feed hinzufügen");
             //dem Button einen neuen Clicklistener hinzufügen
             newFeedBtn.addListener(new Button.ClickListener() {
                //Funktion des Clicklisteners
                public void buttonClick(ClickEvent event) {
                    try {
                        //dem Hauptfenster eine neue Instanz des newfeed_window als Unterfenster hinzufügen und die entsprechenden Parameter übergeben
                        mainWindow.addWindow(new newfeed_window((rss_reader) mainWindow.getApplication(), u.getUserid()));
                    } catch (Exception ex) {
                        Logger.getLogger(rss_reader.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });

            //dem Baumpanel den Baum als Komponente hinzufügen
            treePanel.addComponent(tree);
            //dem Baumpanel den Button zum Anlegen eines neuen Feeds hinzufügen
            treePanel.addComponent(newFeedBtn);

            //neues vertikales LAyout zum teilen der rechten Fläche anlegen
            VerticalLayout left = new VerticalLayout();
            //Größe maximieren
            left.setSizeFull();
            //layout dem Hauptfenster als Komponente hinzufügen
            mainWindow.addComponent(left);
            //Verhältnis des Layout festlegen
            layout.setExpandRatio(left, 1.0f);

            
            //Höhe und Breite der Tabelle festlegen
            tbl.setWidth("100%");
            tbl.setHeight("100%");
            //Tabelle nicht sortierbar machen
            tbl.setSortDisabled(true);
            //Tabellenseitenlänge festlegen
            tbl.setPageLength(50);
            //Spaltenköpfe festlegen
            tbl.addContainerProperty("ID", Integer.class, null);
            tbl.addContainerProperty("Titel", String.class, null);
            tbl.addContainerProperty("Beschreibung", String.class, null);
            tbl.addContainerProperty("Datum", String.class, null);
            //Tabelle dem Layout als Komponente hinzufügen
            left.addComponent(tbl);


            //mainWindow als Hauptfenster festlegen
            setMainWindow(mainWindow);
            //wenn das User-Objekt null ist
            if (u==null)
            {
                //neues leeres Userobjekt erzeugen
                u=new user();
                //neue Instanz des log_window dem Hauptfenster als Fenster unterordnen und öffnen
                mainWindow.addWindow(new log_window(this));
            }
    }

    //Setter für die User-Variable, welche aus Sicherheitsgründen nur private behandelt wird
    public void setUser(user temp)
    {
        u.setEmail(temp.getEmail());
        u.setPassword(temp.getPassword());
        u.setUserid(temp.getUserid());
        u.setUsername(temp.getUsername());
    }


    //Funktion, um die Tabelle anhand eines Feednamen zu füllen
    public void fillTable(String feedname) throws Exception
    {
        //Hinweis mit dem Feednamen ausgeben
       mainWindow.getWindow().showNotification(
                                (String) "Zeige Artikel",
                                (String) feedname,
                                Notification.TYPE_WARNING_MESSAGE);
        //Tabelle leeren
        tbl.removeAllItems();
        //wenn Favoriten als Feedname übergeben
        if (feedname.equals("Favoriten"))
        {
            //fülle momentane Artikel mit den Favoriten des Users
            currentEntries=mysqlEntries.getFavoriteEntries(u.getUserid());
        }
        //sonst
        else
        {
            //hole alle Artikel des Feeds aus der Datenbank
            currentEntries=mysqlEntries.getEntriesByFeednameAndUser(u.getUserid(), feedname);
        }
        //wenn Artikel vorhanden
        if (!currentEntries.isEmpty())
        {
            //für jeden Artikel
            for (int i=0;i<currentEntries.size();i++)
            {
                //Initialisiere eine String-Variable, die später den Inhalt des Artikels abbildet
                String content="";
                //wenn Inhalt des Artikels leer
                if (currentEntries.get(i).getEntrycontents().equals(""))
                {
                    //ausgegebener Inhalt ist...
                    content="Keine Beschreibung vorhanden";
                }
                //sonst
                else
                {
                    //ausgebener Inhalt ist Inhalt aus DB
                    content=currentEntries.get(i).getEntrycontents();
                }
                //füge das Objekt der Tabelle hinzu
                tbl.addItem(new Object[] {currentEntries.get(i).getEntryid(),currentEntries.get(i).getEntryname(),content,currentEntries.get(i).getEntrydate().toString()}, currentEntries.get(i).getEntryid());
               
            }
            //Füge der Tabelle einen neuen ItemClickListener hinzu
             tbl.addListener(new ItemClickListener() {
                    //Funktion des ItemClickListeners
                    public void itemClick(ItemClickEvent event) {
                        //wenn das Item nicht null
                        if (event.getItem()!=null)
                        {
                            //wenn das Anzeigefenster null ist
                            if (openEntryWindow==null)
                            {
                                try {
                                    //erzeuge eine neue Instanz des Anzeigefensters mit Standardwerten
                                    openEntryWindow = new show_window(null, 0,u.getUserid());
                                } catch (Exception ex) {
                                    Logger.getLogger(rss_reader.class.getName()).log(Level.SEVERE, null, ex);
                                }
                            }
                            //wenn das Anzeigefenster nicht offen ist (kein Elternfenster hat)
                            if (openEntryWindow.getParent()==null)
                            {
                                try {
                                    //erzeuge eine neue Instanz des Anzeigefensters mit den Werten des geklickten Items
                                     openEntryWindow = new show_window((rss_reader) mainWindow.getApplication(), Integer.parseInt(event.getItem().getItemProperty("ID").toString()),u.getUserid());
                                    //öffne das Fenster, indem es dem Hauptfenster als Unterfenster hinzugefügt wird
                                     mainWindow.addWindow(openEntryWindow);
                                 } catch (Exception ex) {
                                     Logger.getLogger(rss_reader.class.getName()).log(Level.SEVERE, null, ex);
                                 }
                            }


                        }
                    }
                });
        }
    }

    //Funktion, um den Baum mit Kategorien und Feeds zu füllen
    public void fillTree() throws Exception
    {
            //alle Elemente aus dem Baum entfernen
            tree.removeAllItems();
            //alle Kategorien aus den Datenbank holen
            categories=mysqlCategories.getAllCategories();
            //wenn Kategorien vorhanden
            if (!categories.isEmpty())
            {
                //neues zweidimensionales Objekt-Array zum Füllen des Baums erstellen
                Object[][] feeds=new Object[categories.size()+1][0];
                feeds[0]=new Object[1];
                //ersten Eintrag Favoriten nennen
                feeds[0][0]="Favoriten";
                //alle Kategorien durchlaufen
                for (int i=1;i<=categories.size();i++)
                {
                    //Feeds des Users mit der momentanen Kategorie aus DB holen
                    ArrayList<feed> tempFeeds=mysqlFeeds.getFeedsFromUserOfCategory(u.getUserid(),categories.get(i-1).getCategoryid());
                    //Baumarray mit Kategorie- und Feednamen befüllen
                    feeds[i]=new Object[tempFeeds.size()+1];
                    feeds[i][0]=(Object) categories.get(i-1).getCategoryname();
                    for (int j=1;j<=tempFeeds.size();j++)
                    {
                        feeds[i][j]=(Object) tempFeeds.get(j-1).getFeedname();
                    }
                    

                }
                //Baumarray durchlaufen
                for (int i=0;i<feeds.length;i++)
                {
                    //Object in String umwandeln
                    String Category = (String) (feeds[i][0]);
                    //String dem Baum hinzufügen
                    tree.addItem(Category);
                    //wenn nur eine Ebene dieses Baumeintrags
                    if (feeds[i].length == 1)
                    {
                        //keine Kinder erlauben bzw. hinzufügen
                        tree.setChildrenAllowed(Category, false);
                    }
                    //sonst
                    else
                    {
                        //durchlaufe alle weiteren Einträge
                        for (int j=1; j<feeds[i].length; j++)
                        {
                            //wandle den Wert in einen String um
                            String Feed = (String) feeds[i][j];
                            //Füge es dem Baum hinzu
                            tree.addItem(Feed);
                            //setze die Kategorie als Elterelement des Baums
                            tree.setParent(Feed, Category);
                            //erlaube keine Kinder für dieses Element
                            tree.setChildrenAllowed(Feed, false);
                        }
                    }
                }
                //fange Events des Baums sofort ab
                tree.setImmediate(true);
                //füge dem Baum eine neuen ValueChangeListener hinzu
                tree.addListener(new Tree.ValueChangeListener()
                {
                    //Funktion des ValueChangeListeners
                    public void valueChange(ValueChangeEvent event)
                    {
                        //wenn der derzeitig ausgewählte Wert des Baums nicht null ist
                        if (tree.getValue()!=null)
                        {
                            //wenn es keine Wurzel ist ODER Favoriten ausgewählt wurde
                            if (!tree.isRoot(tree.getValue()) || tree.getValue().toString().equals("Favoriten"))
                            {
                                try {
                                    //fülle die Tabelle
                                    fillTable(tree.getValue().toString());
                                } catch (Exception ex) {
                                    Logger.getLogger(rss_reader.class.getName()).log(Level.SEVERE, null, ex);
                                }
                            }
                            
                        }
                    }
                });

        }
    }

   



        
	
    }
    
    

